import axios from 'axios';
import { useAuthStore } from '@/stores/auth'; // 导入Pinia登录状态管理
import { ElMessage, ElMessageBox } from 'element-plus'; // Element Plus提示组件
import { pinia } from '@/main';

// 1. 创建Axios实例（全局配置：跨域、基础路径、超时、默认头）
const service = axios.create({
    // 基础路径：优先读取环境变量（.env文件配置），默认适配本地后端（含/api前缀）
    baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080/api',
    timeout: 15000, // 超时时间：15秒（适配后端复杂业务逻辑）
    headers: {
        'Content-Type': 'application/json;charset=utf-8', // 默认JSON请求格式
        'X-Request-With': 'XMLHttpRequest' // 标识异步请求（避免后端跨域误判）
    },
    // 关键：开启跨域携带Cookie（与后端allowCredentials: true对应，解决跨域拦截）
    withCredentials: true,
    // 跨域请求时携带的额外参数（可选，根据后端需求调整）
    crossDomain: true
});

// 2. 请求拦截器（Token携带、参数处理、调试日志）
service.interceptors.request.use(
    (config) => {
        try {
            // 2.1 从Pinia获取Token（确保Token格式正确，避免空值/非字符串）
            const authStore = useAuthStore(pinia);
            const token = typeof authStore.token === 'string' ? authStore.token.trim() : '';

            // 仅对非登录接口添加Token（避免登录请求携带无效Token）
            if (token && !config.url?.includes('/auth/login')) {
                config.headers.Authorization = `Bearer ${token}`; // 符合JWT标准格式
            }

            // 2.2 特殊场景：文件上传（覆盖默认Content-Type）
            if (config.headers['Content-Type'] === 'multipart/form-data') {
                // 删除默认JSON头，避免与表单上传头冲突
                delete config.headers['Content-Type'];
            }

            // 2.3 调试日志（区分GET/POST参数，便于问题排查）
            console.log('📤 [请求发送]');
            console.log('地址：', config.method.toUpperCase(), config.baseURL + config.url);
            console.log('参数：', config.method === 'get' ? config.params : config.data);
            console.log('请求头：', config.headers);
            console.log('----------------------------------------');

            return config;
        } catch (err) {
            // 拦截器异常不中断请求，仅打印日志（避免影响正常业务）
            console.error('❌ [请求拦截器异常]：', err.message);
            return config;
        }
    },
    (error) => {
        // 请求发送前错误（如参数格式错误、配置错误）
        console.error('📤 [请求参数错误]：', error.config?.data || error.message);
        ElMessage.warning('请求参数格式错误，请检查输入内容（如必填项、数据类型）');
        return Promise.reject(error);
    }
);

// 3. 响应拦截器（统一响应处理、错误分类、Token过期处理）
service.interceptors.response.use(
    (response) => {
        const res = response.data; // 后端返回核心数据（默认{code, message, data}结构）
        const config = response.config; // 当前请求配置

        // 3.1 成功日志（便于定位业务问题）
        console.log('📥 [接口响应成功]');
        console.log('地址：', config.url);
        console.log('HTTP状态码：', response.status);
        console.log('业务状态码：', res.code);
        console.log('业务消息：', res.message);
        console.log('返回数据：', JSON.stringify(res.data, null, 2));
        console.log('----------------------------------------');

        // 3.2 业务错误处理（后端返回code≠200）
        if (res.code !== 200) {
            // 特殊场景1：Token过期/无效（后端返回401未授权、403无权限）
            if (res.code === 401 || res.code === 403) {
                const authStore = useAuthStore(pinia);

            }
            // 特殊场景2：请求频率限制（如后端防刷机制返回429）
            else if (res.code === 429) {
                ElMessage.warning(`请求过于频繁，请${res.data?.waitSeconds || 60}秒后重试`);
            }
            // 其他业务错误（如参数错误、数据不存在、业务逻辑校验失败）
            else {
                ElMessage.error(res.message || '操作失败，请稍后重试');
            }
            // 将业务错误抛给页面（支持页面自定义错误处理）
            return Promise.reject(new Error(res.message || `业务错误（code: ${res.code}）`));
        }

        // 3.3 业务成功：返回后端数据（页面直接使用res.data）
        return res;
    },
    (error) => {
        // 3.4 网络/服务错误（如跨域、后端未启动、500服务器异常）
        const config = error.config || {};
        const response = error.response || {};

        // 错误日志（详细打印便于排查）
        console.log('❌ [网络/服务错误]');
        console.log('请求地址：', config.url || '未知地址');
        console.log('请求方法：', config.method || '未知方法');
        console.log('错误原因：', error.message || '未知错误');
        console.log('HTTP状态码：', response.status || '无响应');
        console.log('后端错误信息：', response.data?.message || response.data || '无');
        console.log('请求头：', JSON.stringify(config.headers, null, 2));
        console.log('----------------------------------------');

        // 3.5 分类错误提示（提升用户体验，明确错误原因）
        if (error.message.includes('Network Error')) {
            // 网络异常（跨域拦截、后端未启动、地址错误）
            ElMessage.error('网络异常，请检查：\n1. 后端服务是否已启动\n2. 接口地址是否正确\n3. 跨域配置是否生效');
        } else if (error.message.includes('timeout')) {
            // 请求超时（后端处理慢、网络卡顿）
            ElMessage.error(`请求超时（${config.timeout}ms），请：\n1. 检查网络稳定性\n2. 稍后重试\n3. 联系后端优化接口速度`);
        } else if (response.status === 404) {
            // 接口不存在（路径错误、后端未部署该接口）
            ElMessage.error(`请求地址不存在：${config.url}\n请确认：\n1. 接口路径是否正确\n2. 后端是否已发布该接口`);
        } else if (response.status === 500) {
            // 服务器异常（后端代码报错、数据库问题）
            ElMessage.error('后端服务异常，请：\n1. 联系管理员排查\n2. 刷新页面重试\n3. 查看后端控制台日志');
        } else if (response.status === 405) {
            // 请求方法不允许（如后端是GET，前端用了POST）
            ElMessage.error(`请求方法不允许：${config.method}\n请确认后端接口支持的HTTP方法（GET/POST/PUT/DELETE）`);
        } else if (response.status === 413) {
            // 请求体过大（如文件上传超过限制）
            ElMessage.error('请求数据过大（如文件超过后端限制），请压缩数据或联系管理员调整限制');
        } else {
            // 其他未知错误
            ElMessage.error('请求失败，请重试或联系技术支持');
        }

        // 将错误抛给页面（支持页面自定义错误处理）
        return Promise.reject(error);
    }
);

// 4. 定义统一请求函数（兼容两种调用方式：request({...}) 和 request.get/post）
const request = (config) => {
    // 统一处理请求方法大小写（避免前端写'POST'，后端期望'post'导致匹配错误）
    if (config.method) {
        config.method = config.method.toLowerCase();
    }
    // 特殊处理：GET请求参数编码（避免中文/特殊字符乱码）
    if (config.method === 'get' && config.params) {
        config.paramsSerializer = (params) => {
            return Object.entries(params)
                .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
                .join('&');
        };
    }
    return service(config);
};

// 5. 挂载常用请求方法（get/post/put/delete），支持简洁调用
/**
 * GET请求（获取数据）
 * @param {string} url - 接口路径（如'/campus/list'）
 * @param {object} params - URL参数（如{pageNum:1, pageSize:10}）
 * @param {object} config - 额外配置（如自定义请求头、超时）
 * @returns {Promise} - 后端响应
 */
request.get = (url, params = {}, config = {}) => {
    return service({ method: 'get', url, params, ...config });
};

/**
 * POST请求（提交数据）
 * @param {string} url - 接口路径（如'/auth/login'）
 * @param {object} data - 请求体数据（如{username:'test', password:'123'}）
 * @param {object} config - 额外配置（如文件上传的headers）
 * @returns {Promise} - 后端响应
 */
request.post = (url, data = {}, config = {}) => {
    return service({ method: 'post', url, data, ...config });
};

/**
 * PUT请求（更新数据）
 * @param {string} url - 接口路径（如'/campus/update'）
 * @param {object} data - 更新数据（如{id:1, name:'新校区名'}）
 * @param {object} config - 额外配置
 * @returns {Promise} - 后端响应
 */
request.put = (url, data = {}, config = {}) => {
    return service({ method: 'put', url, data, ...config });
};

/**
 * DELETE请求（删除数据）
 * @param {string} url - 接口路径（如'/campus/delete'）
 * @param {object} params - URL参数（如{id:1}）
 * @param {object} config - 额外配置
 * @returns {Promise} - 后端响应
 */
request.delete = (url, params = {}, config = {}) => {
    return service({ method: 'delete', url, params, ...config });
};

// 6. 导出request（供API封装文件调用，如src/api/auth.js）
export default request;
    